package tec ;

class Autobus implements Bus, Transport
{
    private JaugeNaturel jaugeAssis;
    private JaugeNaturel jaugeDebout;
    private Passager[] passagers;
    private int nbPassagers ;
    private int numeroArret = 0;
	
    protected Autobus(int nbPlaceAssise, int nbPlaceDebout)
    {   if(nbPlaceAssise <0 || nbPlaceDebout <0)
	    throw new IllegalArgumentException("Les nombres de place doivent etre positif");

	jaugeAssis  = new JaugeNaturel(0, nbPlaceAssise, 0);
	jaugeDebout = new JaugeNaturel(0, nbPlaceDebout, 0);

        nbPassagers = 0;
        passagers = new Passager[nbPlaceAssise + nbPlaceDebout];
    }
    
    public void allerArretSuivant() throws TecInvalidException,IllegalStateException{
       numeroArret++;
       /*Parcours du tableau à l'envers pour éviter les conflits
        * lors de la decsente (suppresion d'un passager
        */
	PassagerAbstrait pa;
       for(int i = nbPassagers-1 ; i >= 0 ; i--)
       {
		pa = (PassagerAbstrait) passagers[i];
		if(pa.getDestination()-numeroArret<0)
			throw new IllegalStateException();
          passagers[i].nouvelArret(this,numeroArret);

       }
    
    }
    
    public boolean aPlaceAssise()
    {
	return (!jaugeAssis.estRouge()); 
    }
    

    public boolean aPlaceDebout()
    {
	return (!jaugeDebout.estRouge());
    }	    
	
    public void demanderChangerEnAssis(Passager p) throws IllegalStateException  { 
	if(p.estAssis())
		throw new IllegalStateException();
	if(aPlaceAssise())
       {
          p.accepterPlaceAssise();
          jaugeAssis.incrementer();
          jaugeDebout.decrementer();
       }
    }
	    
    public void demanderChangerEnDebout(Passager p) throws IllegalStateException 
    { 	
	if (p.estDebout())
		throw new IllegalStateException();
       if(aPlaceDebout())
       {
          p.accepterPlaceDebout();
          jaugeAssis.decrementer();
          jaugeDebout.incrementer();
       }
          
    }

    public void demanderPlaceAssise(Passager p)
    {
//	if(aPlaceAssise()){
          p.accepterPlaceAssise();
          passagers[nbPassagers] = p;
          nbPassagers++;
          jaugeAssis.incrementer();
  //      }
    } 

    public void demanderPlaceDebout(Passager p)
    {
//	 if (aPlaceDebout())
//	{
          p.accepterPlaceDebout();
          passagers[nbPassagers] = p;
          nbPassagers++;
          jaugeDebout.incrementer();
//	 }
    }

    public void demanderSortie(Passager p)
    {
	if(p.estDebout())
	    jaugeDebout.decrementer();
	else if (p.estAssis())
	    jaugeAssis.decrementer();

	p.accepterSortie();
        for(int i = 0 ; i < nbPassagers ; i++)
           if(passagers[i] == p){
              passagers[i] = passagers[nbPassagers-1] ;
              passagers[nbPassagers-1] = null ;
              nbPassagers--;
              break;
           }
    }

   public String toString() {
       return "[arret:"+ numeroArret + ", assis:" + jaugeAssis +
          ", debout:" + jaugeDebout + "]";
    }
    
 

}
